// The Vue build version to load with the `import` command
// (runtime-only or standalone) has been set in webpack.base.conf with an alias.
import Vue from 'vue'
import App from './App'
import router from './router'//路由
import iView from 'iview'//iview
import {Message, Spin} from 'iview'
import 'iview/dist/styles/iview.css' // 使用 CSS
import axios from "axios"//ajax
import ZkTable from 'vue-table-with-tree-grid'//树形表格
import G2 from '@antv/g2';//统计图
import G6 from '@antv/g6';//图可视化引擎
Vue.prototype.G6 = G6;

import BaiduMap from 'vue-baidu-map';//百度地图

import 'font-awesome/css/font-awesome.min.css'//字体样式
// Vue.prototype.baseURLLogin = process.env.API_LOGIN;
// Vue.prototype.baseURL = process.env.API_ROOT;
Vue.prototype.acrossDomains = process.env.ACROSS_DOMAINS;//跨域获取数据

//图片查看使用
import Viewer from 'v-viewer'
import 'viewerjs/dist/viewer.css'

Vue.use(Viewer);
Viewer.setDefaults({
  Options: {
    "inline": true,
    "button": true,
    "navbar": true,
    "title": true,
    "toolbar": true,
    "tooltip": true,
    "movable": true,
    "zoomable": true,
    "rotatable": true,
    "scalable": true,
    "transition": true,
    "fullscreen": true,
    "keyboard": true,
    "url": "data-source"
  }
});
//图片查看使用

Vue.use(BaiduMap, {
  ak: "2pSikfIkbZoTq08A05sOFFeMA4XpQX2C"
})

import Print from '@/assets/plugs/print'

Vue.use(Print) // 注册

Vue.use(iView)
Vue.use(ZkTable)
Vue.prototype.axios = axios

import Video from 'video.js'
import 'video.js/dist/video-js.css'

Vue.prototype.$video = Video

import qs from 'qs'//表单提交数据格式化
Vue.prototype.qs = qs;

import QRCode from 'qrcodejs2'  // 引入qrcode 二维码
Vue.prototype.$QRCode = QRCode;

//公共方法 和变量
import global from './api/common.js'

Vue.prototype.public = global//把引入的公共方法 变成全局使用
// // 调用全集方法 和变量 that.public.commonFun();
//按钮权限使用
import hasPermission from './api/hasPermission.js';

Vue.use(hasPermission);
//全部请求接口
import apiUrl from './api/api.js'

Vue.prototype.apiUrl = apiUrl;//把引入的公共方法 变成全局使用


//公共路由 使用
import loadNav from './router/dynamicRouting.js'
Vue.prototype.loadNav = loadNav//把引入的公共方法 变成全局使用


//axios 加拦截器 发送拦截
axios.interceptors.request.use(function (config) {

    // console.log("发送拦截", config.url)//
    if (!!config.url) {
      if (!!sessionStorage.getItem('loginData')) {  // 判断是否存在token，如果存在的话，则每个http header都加上token
        // console.log("在发送请求之前做些什么")
        // console.log(sessionStorage.getItem('loginData'))
        if (!!JSON.parse(sessionStorage.getItem('loginData')).access_token) {
          config.headers.Authorization = "Bearer " + JSON.parse(sessionStorage.getItem('loginData')).access_token;
        }
      }
    }
    return config;
  },
  function (error) {
    // console.log("对请求错误做些什么")
    return Promise.reject(error);
  }
);
/*是否有请求正在刷新token*/
window.isRefreshing = false;
/*被挂起的请求数组*/
let refreshSubscribers = [];

/*push所有请求到数组中*/
function subscribeTokenRefresh(cb) {
  refreshSubscribers.push(cb)
}

/*刷新请求（refreshSubscribers数组中的请求得到新的token之后会自执行，用新的token去请求数据）*/
function onRrefreshed() {
  refreshSubscribers.map(cb => cb())
}

//接受拦截
axios.interceptors.response.use(function (response) {
  // 这里是200正常响应，需要判断业务code,业务code 0/200是正常的，其它的需要提示
  response.status //http响应码
  if (response.data.code != 200 && response.data.code != 0) {
    Spin.hide();
    Message.warning(response.data.msg);
  } else {
    return response;
  }
}, function (error) {
  /*优先判断500，该错误属于系统级未知错误*/
  /*
  * 判断401，此处401可能有两种情况：
  * 1.认证返回的401,直接提示错误
  * 2.调取业务接口返回的401或者403，尝试刷新token（只刷新一次，成功继续回调未完成的业务接口，失败直接跳登录页）
  * 3.其它异常需要开发阶段解决，控制台打印即可
  * */
  if (error.response.status === 500) {
    Spin.hide();
    Message.error({
      content: '系统出现未知异常，请联系0319-3303099。',
      duration: 5
    });
  } else if (error.response.status === 403) {
    //这里刷新token
    if (!window.isRefreshing) {
      /*将刷新token的标志置为true*/
      window.isRefreshing = true
      var data = qs.stringify({
        "refresh_token": JSON.parse(sessionStorage.getItem('loginData')).refresh_token,
        "grant_type": "refresh_token",
        "client_id": "xd-client",
        "client_secret": "xd-secret",
        'platformCode': "SAFETY",
        'platformClient': "PC"
      })
      axios({
        url: apiUrl.oauthToken,
        method: 'POST',
        data: data,
        headers: {'Content-Type': "application/x-www-form-urlencoded"}
      }).then((res) => {
        if (!!res) {
          /*将标志置为false*/
          window.isRefreshing = false;
          sessionStorage.setItem("loginData", JSON.stringify(res.data));
          onRrefreshed(res.data)
          refreshSubscribers = [];
        } else {
          Spin.hide();
          Message.error({
            content: "未识别到您的身份，请重新登录",
            onClose: function () {
              sessionStorage.clear();// 删除所有数据
              router.push({
                path: "/"
              })
            }
          });
        }
      }).catch(err => {
        console.log("失败", err)
        Spin.hide();
        Message.error({
          content: "未识别到您的身份，请重新登录",
          onClose: function () {
            sessionStorage.clear();// 删除所有数据
            router.push({
              path: "/"
            })
          }
        });
      });
    }
    /*把请求(token)=>{....}都push到一个数组中*/
    let retry = new Promise((resolve, reject) => {
      subscribeTokenRefresh(function () {
        resolve(axios(error.response.config))
      })
    })
    return retry;
  } else if (error.response.status === 401) {
    //这里需要判断是认证接口响应还是子系统业务接口响应，如果是认证接口响应，直接提示错误即可
    if (error.response.data.hasOwnProperty('code')) {
      let code = error.response.data.code
      if (code === 100) {
        Spin.hide();
        Message.error({
          content: error.response.data.msg,
          duration: 5
        });
      } else {
        if (!window.isRefreshing) {
          /*将刷新token的标志置为true*/
          window.isRefreshing = true
          var data = qs.stringify({
            "refresh_token": JSON.parse(sessionStorage.getItem('loginData')).refresh_token,
            "grant_type": "refresh_token",
            "client_id": "xd-client",
            "client_secret": "xd-secret",
            'platformCode': "SAFETY",
            'platformClient': "PC"
          })
          axios({
            url: apiUrl.oauthToken,
            method: 'POST',
            data: data,
            headers: {'Content-Type': "application/x-www-form-urlencoded"}
          }).then((res) => {
            if (!!res) {
              /*将标志置为false*/
              window.isRefreshing = false;
              sessionStorage.setItem("loginData", JSON.stringify(res.data));
              onRrefreshed(res.data)
              refreshSubscribers = [];
            } else {
              Spin.hide();
              Message.error({
                content: "未识别到您的身份，请重新登录",
                onClose: function () {
                  sessionStorage.clear();// 删除所有数据
                  router.push({
                    path: "/"
                  })
                }
              });
            }
          }).catch(err => {
            console.log("失败", err)
            Spin.hide();
            Message.error({
              content: "未识别到您的身份，请重新登录",
              onClose: function () {
                sessionStorage.clear();// 删除所有数据
                router.push({
                  path: "/"
                })
              }
            });
          });
        }
        /*把请求(token)=>{....}都push到一个数组中*/
        let retry = new Promise((resolve, reject) => {
          subscribeTokenRefresh(function () {
            resolve(axios(error.response.config))
          })
        })
        return retry;
      }
    } else {
      Spin.hide();
      Message.error({
        content: '认证异常，请联系0319-3303099。',
        duration: 5
      });
    }
  } else {
    Spin.hide();
    Message.error({
      content: error.response.data.msg,
      duration: 5
    });
  }
});

Vue.config.productionTip = false

/* eslint-disable no-new */
new Vue({
  el: '#app',
  router,
  components: {App},
  template: '<App/>',
  //在main.js 写入 公共变量
  //that.$root.wz 读取
  //that.$root.wz = "" 修改
  data: function () {
    return {
      wz: {},
    }
  }
})

